package Listeners;

import AppView.MenuSection;
import RuntimeInfo.IOHandle;
import RuntimeInfo.State;

import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

public class MenuListeners {
    public static MenuSection menu;


    public static ActionListener getOpenFileActionListener() {
        return e -> {

            // 当前还有绘图
            if (State.shapeList.size() > 0) {
                // 已经选定文件
                clearCanvas();
            }

            JFileChooser jf = initFileChooser();
            jf.setDialogTitle("打开文件");
            if (jf.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {

                // 如果文件存在
                if (jf.getSelectedFile().exists()) {
                    if (jf.getSelectedFile().getPath().toLowerCase().endsWith(".cad")) {

                        try {
                            IOHandle.loadFile(jf.getSelectedFile());
                        } catch (IOException | ClassNotFoundException ioException) {
//                            ioException.printStackTrace();
                            JOptionPane.showOptionDialog(null, "文件内容错误", "错误",
                                    JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE,
                                    null, null, null);
                        }

                        State.canvas.repaint();
                    } else {
                        // 防止在默认模式中选择错误文件
                        JOptionPane.showOptionDialog(null, "文件格式不符合要求", "错误",
                                JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE,
                                null, null, null);
                    }

                } else {
                    // 指明文件不存在

                    JOptionPane.showOptionDialog(null, "该文件不存在", "错误",
                            JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE,
                            null, null, null);
                }

            }

        };
    }

    public static ActionListener getNewFileActionListener() {
        return e -> {

            // 当前还有绘图
            if (State.shapeList.size() > 0) {
                clearCanvas();
            }
            // 使用预定义的文件选择器
            JFileChooser jf = initFileChooser();
            jf.setDialogTitle("新建文件");
            jf.setApproveButtonText("确认");
            jf.setSelectedFile(new File("untitleNew.cad")); // 设置默认新建文件名
            if (jf.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                File dataFile = jf.getSelectedFile();

                if (dataFile.exists()) {
                    // 如果默认的文件已存在，则发出错误提醒
                    JOptionPane.showOptionDialog(null, "该文件已经存在，请自行命名新建文件名", "错误",
                            JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE,
                            null, null, null);
                    return;
                }
                // 防止在默认模式中选择错误文件
                if (!dataFile.getPath().endsWith(".cad")) {
                    JOptionPane.showOptionDialog(null, "文件格式不符合要求", "错误",
                            JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE,
                            null, null, null);
                    return;
                }
                try {
                    dataFile.createNewFile();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }

                try {
                    IOHandle.loadFile(dataFile); // 设置当前文件
                } catch (Exception exception) {
                    exception.printStackTrace();
                }
                State.canvas.repaint();// 需要重绘，因为可能需要抹去上一张图的内容
            }

        };
    }

    public static ActionListener getSaveFileActionListener() {
        return e -> {

            if (State.curFile == null) {
                JFileChooser jf = initFileChooser();
                jf.setDialogTitle("保存文件");
                jf.setApproveButtonText("保存");
                jf.setSelectedFile(new File("autoSaved.cad")); // 设置默认新建文件名
                if (jf.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                    File dataFile = jf.getSelectedFile();
                    if (dataFile.exists()) { // 如果默认的文件已存在,就询问是否对该文件进行覆盖
                        int ret = JOptionPane.showConfirmDialog(null, "该文件已存在，是否进行覆盖？");
                        if (ret != 0) return;

                    } else {
                        try {
                            dataFile.createNewFile();
                        } catch (IOException ioException) {
                            ioException.printStackTrace();
                        }
                    }
                    State.curFile = dataFile;
                    State.canvas.repaint();
                }
            }
            // 之前可能由于对话框的中断，运行到此处时仍然没有设定当前文件，所以增加这个判定
            if (State.curFile != null) {
                try {
                    IOHandle.saveFile();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            }


        };
    }


    /**
     * 为CAD文件和项目构建对应的文件选择器,首先生成储存数据文件的CADdata文件夹，再在文件夹中应用过滤器规则
     *
     * @return 生成的文件选择器
     */
    static JFileChooser initFileChooser() {
        JFileChooser jf;
        File dataPath = new File("CADdata");
        if (dataPath.exists()) {
            jf = new JFileChooser(dataPath.getPath());
        } else {
            new File("CADdata").mkdir();
            jf = new JFileChooser("CADdata");

        }

        jf.setFileFilter(new CADFileFilter());
        return jf;
    }

    /**
     * 在当前画布不空的情况下
     */
    static void clearCanvas() {
        // 已经选定文件
        if (State.curFile != null) {
            int ret = JOptionPane.showConfirmDialog(null, "当前的绘图将会被保存，是否继续？");
            if (ret != 0) return;
            try {
                IOHandle.saveFile();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        } else {// 没有选定文件，默认不会被保存
            int ret = JOptionPane.showConfirmDialog(null, "没有选择文件，当前绘图将不会被保存，是否继续？");
            if (ret != 0) return;

        }
        State.clear();
    }

    static class CADFileFilter extends FileFilter {
        @Override
        public boolean accept(File f) {
            String name = f.getName();
            return f.isDirectory() || name.toLowerCase().endsWith(".cad");
        }

        @Override
        public String getDescription() {
            return "CAD文件（.cad）";
        }
    }
}
